
package dominioDAO;

import hbt.HibernateDAO;
import hbt.HibernateUtil;

import java.util.ArrayList;
import java.util.List;

import org.hibernate.Session;
import org.hibernate.SessionFactory;

import dominioEntity.ItemCotizacion;
import dominioEntity.ItemListaPrecios;
import dominioEntity.ListaPrecios;
import dominioEntity.Proveedor;
import dominioEntity.Rodamiento;
import dominioTO.ItemListaPreciosTO;
import dominioTO.ListaPreciosTO;


// Cliente lado Servidor DAO (Persistencia)

public class ListaPreciosDAO{
	private static ListaPreciosDAO instancia ;
	private static SessionFactory sf;
	private static Session session;
	
	public static ListaPreciosDAO getInstancia() {
		if(instancia == null){
			instancia = new ListaPreciosDAO();
		} 
		return instancia;
	}
	public ListaPreciosDAO()
	{
		sf = HibernateUtil.getSessionFactory();
	}
	
	protected Session getSession(){
		if(session == null || !session.isOpen()){
			session = sf.openSession();
		}
		return session;
	}
	
	protected void closeSession()
	{
		if(session.isOpen())
		{
			session.close();
		}
	}
	public void persistirListaTO(ListaPreciosTO listaTO)
	{	
		
		
		//private String condicionCompra;
		//private String descuento30;
		//private String descuento60;
		//private String descuento90;
				
		ListaPrecios lista = new ListaPrecios();		
		lista.setCodigoLista(listaTO.getCodigoLista());
		lista.setFechaDesde(listaTO.getFechaDesde());
		lista.setDiasVigencia(listaTO.getDiasVigencia());
		lista.setTipo(listaTO.getTipo());
		lista.setVigente(true);
		lista.setProveedor(ProveedorDAO.getInstancia().buscarProveedor(listaTO.getProveedor().getCuit()));
		
		List<ItemListaPrecios> itemsLista = new ArrayList<ItemListaPrecios>();
		for(ItemListaPreciosTO itemTO : listaTO.getItemsListaPecio())
		{
			ItemListaPrecios item = new ItemListaPrecios();
			item.setRodamiento(RodamientoDAO.getInstancia().getRodamiento(itemTO.getRodamiento()));
			item.setPrecioVenta(itemTO.getPrecioCompra());
			itemsLista.add(item);
		}
		lista.setItemsListaPecio(itemsLista);
		
		this.grabarSolicitud(lista);
	}
	
	
	@SuppressWarnings("unchecked")
	public List<ItemListaPrecios> obtenerMejorLista(Rodamiento rod) {
		
		Session s = this.getSession();
		s.beginTransaction();
		//"select its, p from ListaPrecios lista  cv join l.proveedor p join l.items its join its.rodamiento r where r.id.sufijo=? and r.id.nroSerie =?  " +
		 String query =  "select  its from ListaPrecios lista "
								+ "join lista.proveedor p "
								+ "join lista.itemsListaPecio its "
								+ "join its.rodamiento rod "
								+ "where rod.descripcion=:descripcion and rod.nSerie=:nSerie and rod.prefijo=:prefijo and rod.sufijo=:sufijo"
								+ " order by its.precioVenta desc";//
		 List<ItemListaPrecios> result = (List<ItemListaPrecios>) s.createQuery(query).setProperties(rod).list();
		
		s.flush();
		s.getTransaction().commit();
		this.closeSession();
		
		return result; // 0: ItemLista 1: proveedor 2
	}

	public Proveedor buscarProveedorLista(Integer id)
	{
		String query ="select p from ListaPrecios l "
									+ "join l.proveedor p "
									+ "join l.itemsListaPecio itemL "
									+ "where itemL.id="+id;
		
		Proveedor prov  = (Proveedor)HibernateDAO.getInstancia().totalizador(query);
		return prov;
	}

	public ItemListaPrecios buscarItemListaPrecios(Integer id)
	{
		String query ="from ItemListaPrecios i "									
									+ "where i.id="+id;
		
		ItemListaPrecios i  = (ItemListaPrecios)HibernateDAO.getInstancia().totalizador(query);
		return i;
	}
	
	
	public void grabarSolicitud(ListaPrecios lp) {
		
		Session s = this.getSession();
		s.beginTransaction();
		s.merge(lp);
		s.flush();
		session.getTransaction().commit();
		this.closeSession();

	}
	
}
